package com.kk.demo.unsface.third;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel.MapMode;

/**
 * MappedByteBuffer所用的内存是属于JVM的还是JVM之外的
 * 
 * 此题思路，针对JVM的内存进行设置最大内存(256M，
 * 
 * 然后将MappedByteBuffer的内存设置超大512M，大到超过JVM的内存，检查是档口报错
 * 
* 源文件名：MappedByteBufferTest.java
* 文件版本：1.0.0
* 创建作者：Think
* 创建日期：2016年12月4日
* 修改作者：Think
* 修改日期：2016年12月4日
* 文件描述：TODO
* 版权所有：Copyright 2016 zjhz, Inc. All Rights Reserved.
*/
public class MappedByteBufferTest {

    public static void main(String[] args) {

        int jvmSize = 1024 * 1024 * 128;

        byte[] bigByte = new byte[jvmSize];

        // 进行填充
        for (int i = 0; i < jvmSize; i++) {
            bigByte[i] = (byte) i;
        }

        System.out.println("jvm填充完结");

        // 在java堆上声明一个大数组
        int value = 512 * 1024 * 1024;

        File file = new File("D:/java/test/data.txt");

        // 分配一块内存大小
        MappedByteBuffer byteBuffer = null;
        try {
            byteBuffer = new RandomAccessFile(file, "rw").getChannel()
                    .map(MapMode.READ_WRITE, 0, value);
            // 进行填充
            for (int i = 0; i < value; i++) {
                byteBuffer.put((byte) i);
            }

            System.out.println("结果：" + byteBuffer);

            byteBuffer = null;

        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            Thread.currentThread().sleep(1000000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
